package co.edu.usbcali.sgi.presentation.backEndBeans;

import co.edu.usbcali.sgi.exceptions.*;
import co.edu.usbcali.sgi.modelo.*;
import co.edu.usbcali.sgi.modelo.dto.VehiculoDTO;
import co.edu.usbcali.sgi.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.sgi.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;


/**
 *
 *
 * @author Zathura Code Generator http://code.google.com/p/zathura
 *
 */
public class VehiculoView extends DataSource implements Renderable,
DisposableBean {
	public HtmlSelectOneMenu getCmbEstCodigo_Estado() {
		try {
			List<Estado> list = BusinessDelegatorView.findByCriteriaInEstado(
					null, null, null);
			listEstado.clear();
			listEstado.add(new SelectItem(0, " Seleccione el Estado.. "));

			for (Estado estado : list) {
				listEstado.add(new SelectItem(estado.getEstCod(), estado
						.getEstNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cmbEstCodigo_Estado;
	}

	public void setCmbEstCodigo_Estado(HtmlSelectOneMenu cmbEstCodigoEstado) {
		cmbEstCodigo_Estado = cmbEstCodigoEstado;
	}

	public List<SelectItem> getListEstado() {
		return listEstado;
	}

	public void setListEstado(List<SelectItem> listEstado) {
		this.listEstado = listEstado;
	}

	public HtmlSelectOneMenu getCmbTipoVehiculo() {
		try {
			List<TipoVehiculo> list = BusinessDelegatorView.findByCriteriaInTipoVehiculo(null, null, null);
			listVehiculo.clear();
			listVehiculo.add(new SelectItem(0, " -- Seleccione Tipo de Vehiculo -- "));

			for (TipoVehiculo tipVeh : list) {
				listVehiculo.add(new SelectItem(tipVeh.getTpvCod(), tipVeh.getTpvNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}

		return cmbTipoVehiculo;
	}

	public void setCmbTipoVehiculo(HtmlSelectOneMenu cmbTipoVehiculo) {
		this.cmbTipoVehiculo = cmbTipoVehiculo;
	}

	public HtmlSelectOneMenu getCmbMarca() {
		return cmbMarca;
	}

	public void setCmbMarca(HtmlSelectOneMenu cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	public List<SelectItem> getListVehiculo() {
		return listVehiculo;
	}

	public void setListVehiculo(List<SelectItem> listVehiculo) {
		this.listVehiculo = listVehiculo;
	}

	public List<Marca> getMarca() {
		return marca;
	}

	public void setMarca(List<Marca> marca) {
		this.marca = marca;
	}

	public List<SelectItem> getListMarca() {
		return listMarca;
	}

	public void setListMarca(List<SelectItem> listMarca) {
		this.listMarca = listMarca;
	}

	private HtmlInputText txtVehColor;
	private HtmlSelectOneMenu cmbEstCodigo_Estado;

	private HtmlInputText txtPerCedula_Persona;

	private HtmlSelectOneMenu cmbTipoVehiculo;
	private HtmlSelectOneMenu cmbMarca;


	private HtmlInputText txtVehCod;
	private SelectInputDate txtVehModelo;
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private boolean renderDataTable;
	private boolean flag = true;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<Vehiculo> vehiculo;
	private List<VehiculoDTO> vehiculoDTO;
	private List<SelectItem> listVehiculo = new ArrayList<SelectItem>();
	private List<Marca> marca;
	private List<SelectItem> listMarca;
	private List<SelectItem> listEstado = new ArrayList<SelectItem>();

	public VehiculoView() {
		super("");
	}

	public String action_clear() {
		txtVehColor.setValue(null);
		txtVehColor.setDisabled(true);
		cmbEstCodigo_Estado.setValue(null);
		cmbEstCodigo_Estado.setDisabled(true);
		cmbMarca.setValue(null);
		cmbMarca.setDisabled(true);
		txtPerCedula_Persona.setValue(null);
		txtPerCedula_Persona.setDisabled(true);
		cmbTipoVehiculo.setValue(null);
		cmbTipoVehiculo.setDisabled(true);
		txtVehModelo.setValue(null);
		txtVehModelo.setDisabled(true);
		txtVehCod.setValue(null);
		txtVehCod.setDisabled(false);
		btnSave.setDisabled(true);
		btnDelete.setDisabled(true);
		btnModify.setDisabled(true);
		btnClear.setDisabled(false);

		return "";
	}

	public void listener_txtId(ValueChangeEvent event) {
		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
			Vehiculo entity = null;

			try {
				String vehCod = new String(txtVehCod.getValue().toString());
				entity = BusinessDelegatorView.getVehiculo(vehCod);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				txtVehColor.setDisabled(false);
				cmbEstCodigo_Estado.setDisabled(false);
				cmbMarca.setDisabled(false);
				txtPerCedula_Persona.setDisabled(false);
				cmbTipoVehiculo.setDisabled(false);
				txtVehModelo.setDisabled(false);
				txtVehCod.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				txtVehColor.setValue(entity.getVehColor());
				txtVehColor.setDisabled(false);
				txtVehModelo.setValue(entity.getVehModelo());
				txtVehModelo.setDisabled(false);
				cmbEstCodigo_Estado.setValue(entity.getEstado().getEstCod());
				cmbEstCodigo_Estado.setDisabled(false);
				cmbMarca.setValue(entity.getMarca().getMarCod());
				cmbMarca.setDisabled(false);
				txtPerCedula_Persona.setValue(entity.getPersona().getPerCedula());
				txtPerCedula_Persona.setDisabled(false);
				cmbTipoVehiculo.setValue(entity.getTipoVehiculo()
						.getTpvCod());
				cmbTipoVehiculo.setDisabled(false);
				txtVehCod.setValue(entity.getVehCod());
				txtVehCod.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}

	public String action_save() {
		try {
			BusinessDelegatorView.saveVehiculo(FacesUtils.checkString(txtVehCod),
					FacesUtils.checkString(txtVehColor),
					FacesUtils.checkDate(txtVehModelo),
					FacesUtils.checkString(cmbEstCodigo_Estado),
					FacesUtils.checkString(cmbMarca),
					FacesUtils.checkString(txtPerCedula_Persona),
					FacesUtils.checkString(cmbTipoVehiculo));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deleteVehiculo(FacesUtils.checkString(
					txtVehCod));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
	public void llenarMarca (ValueChangeEvent evento)throws Exception{
		try {
			marca= BusinessDelegatorView.consultarMarca(String.valueOf(evento.getNewValue().toString()));
			
			listMarca = new ArrayList<SelectItem>();
			
			listMarca.add(new SelectItem(0," -- Seleccione Marca -- "));
			
			for (int i = 0; i < marca.size(); i++) {
				SelectItem item = new SelectItem();
				
				item.setValue(marca.get(i).getMarCod());
				item.setLabel(marca.get(i).getMarNombre());
				
				listMarca.add(item);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public String action_modify() {
		try {
			BusinessDelegatorView.updateVehiculo(FacesUtils.checkString(
					txtVehCod), FacesUtils.checkString(txtVehColor),
					FacesUtils.checkDate(txtVehModelo),
					FacesUtils.checkString(cmbEstCodigo_Estado),
					FacesUtils.checkString(cmbMarca),
					FacesUtils.checkString(txtPerCedula_Persona),
					FacesUtils.checkString(cmbTipoVehiculo ));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String vehCod, String vehColor,
			Date vehModelo, String estCod_Estado, String marCod_Marca,
			String perCedula_Persona, String tpvCod_TipoVehiculo)
	throws Exception {
		try {
			BusinessDelegatorView.updateVehiculo(vehCod, vehColor, vehModelo,
					estCod_Estado, marCod_Marca, perCedula_Persona,
					tpvCod_TipoVehiculo);
			renderManager.getOnDemandRenderer("VehiculoView").requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			//renderManager.getOnDemandRenderer("VehiculoView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<Vehiculo> getVehiculo() {
		if (flag) {
			try {
				vehiculo = BusinessDelegatorView.getVehiculo();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return vehiculo;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setVehiculo(List<Vehiculo> vehiculo) {
		this.vehiculo = vehiculo;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberVehiculo() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	 private DataPage<Vehiculo> getDataPage(int startRow, int pageSize) {
		 // Retrieve the total number of objects from the database.  This
		 // number is required by the DataPage object so the paginator will know
		 // the relative location of the page data.
		 int totalNumberVehiculo = 0;

		 try {
			 totalNumberVehiculo = BusinessDelegatorView.findTotalNumberVehiculo()
			 .intValue();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Calculate indices to be displayed in the ui.
		 int endIndex = startRow + pageSize;

		 if (endIndex > totalNumberVehiculo) {
			 endIndex = totalNumberVehiculo;
		 }

		 try {
			 vehiculo = BusinessDelegatorView.findPageVehiculo(sortColumnName,
					 sortAscending, startRow, endIndex - startRow);

			 // Remove this Renderable from the existing render groups.
			 //leaveRenderGroups();        			
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Add this Renderable to the new render groups.
		 //joinRenderGroups();
		 // Reset the dirtyData flag.
		 onePageDataModel.setDirtyData(false);
		 // This is required when using Hibernate.  If the SessionManager is not
		 // cleared or closed objects are cached and stale objects will show up
		 // in the table.
		 // This way, the detached objects are reread from the database.
		 // This call is not required with Hibernate, which uses a Query Hint
		 // to clear the l2 cache in the DAO.
		 flag = true;

		 return new DataPage<Vehiculo>(totalNumberVehiculo, startRow, vehiculo);
	 }

	 public DataModel getDataDTO() {
		 state = PersistentFacesState.getInstance();

		 if (onePageDataModel == null) {
			 onePageDataModel = new LocalDataModelDTO(pageSize);
		 }

		 return onePageDataModel;
	 }

	 /**
	  * This is where the Object data is retrieved from the database and
	  * returned as a list of objects for display in the UI.
	  */
	 private DataPage<VehiculoDTO> getDataPageDTO(int startRow, int pageSize) {
		 // Retrieve the total number of objects from the database.  This
		 // number is required by the DataPage object so the paginator will know
		 // the relative location of the page data.
		 int totalNumberVehiculo = 0;

		 try {
			 totalNumberVehiculo = BusinessDelegatorView.findTotalNumberVehiculo()
			 .intValue();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Calculate indices to be displayed in the ui.
		 int endIndex = startRow + pageSize;

		 if (endIndex > totalNumberVehiculo) {
			 endIndex = totalNumberVehiculo;
		 }

		 try {
			 vehiculo = BusinessDelegatorView.findPageVehiculo(sortColumnName,
					 sortAscending, startRow, endIndex - startRow);

			 if (Utilities.validationsList(vehiculo)) {
				 vehiculoDTO = new ArrayList<VehiculoDTO>();

				 for (Vehiculo vehiculoTmp : vehiculo) {
					 VehiculoDTO vehiculoDTO2 = new VehiculoDTO();
					 vehiculoDTO2.setVehCod(vehiculoTmp.getVehCod().toString());
					 vehiculoDTO2.setVehColor((vehiculoTmp.getVehColor() != null)
							 ? vehiculoTmp.getVehColor().toString() : null);
					 vehiculoDTO2.setVehModelo(vehiculoTmp.getVehModelo());
					 vehiculoDTO2.setEstCod_Estado((vehiculoTmp.getEstado()
							 .getEstCod() != null)
							 ? vehiculoTmp.getEstado().getEstCod().toString() : null);
					 vehiculoDTO2.setMarCod_Marca((vehiculoTmp.getMarca()
							 .getMarCod() != null)
							 ? vehiculoTmp.getMarca().getMarCod().toString() : null);
					 vehiculoDTO2.setPerCedula_Persona((vehiculoTmp.getPersona()
							 .getPerCedula() != null)
							 ? vehiculoTmp.getPersona().getPerCedula().toString()
									 : null);
					 vehiculoDTO2.setTpvCod_TipoVehiculo((vehiculoTmp.getTipoVehiculo()
							 .getTpvCod() != null)
							 ? vehiculoTmp.getTipoVehiculo().getTpvCod().toString()
									 : null);
					 vehiculoDTO2.setVehiculo(vehiculoTmp);
					 vehiculoDTO2.setVehiculoView(this);
					 vehiculoDTO.add(vehiculoDTO2);
				 }
			 }

			 // Remove this Renderable from the existing render groups.
			 leaveRenderGroups();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Add this Renderable to the new render groups.
		 joinRenderGroups();
		 // Reset the dirtyData flag.
		 onePageDataModel.setDirtyData(false);
		 // This is required when using Hibernate.  If the SessionManager is not
		 // cleared or closed objects are cached and stale objects will show up
		 // in the table.
		 // This way, the detached objects are reread from the database.
		 // This call is not required with Hibernate, which uses a Query Hint
		 // to clear the l2 cache in the DAO.
		 flag = true;

		 return new DataPage<VehiculoDTO>(totalNumberVehiculo, startRow,
				 vehiculoDTO);
	 }

	 protected boolean isDefaultAscending(String sortColumn) {
		 return true;
	 }

	 /**
	  * This method is called when a render call is made from the server. Render
	  * calls are only made to views containing an updated record. The data is
	  * marked as dirty to trigger a fetch of the updated record from the
	  * database before rendering takes place.
	  */
	 public PersistentFacesState getState() {
		 onePageDataModel.setDirtyData();

		 return state;
	 }

	 /**
	  * This method is called from faces-config.xml with each new session.
	  */
	 public void setRenderManager(RenderManager renderManager) {
		 this.renderManager = renderManager;
	 }

	 public void renderingException(RenderingException arg0) {
		 if (arg0 instanceof TransientRenderingException) {
		 } else if (arg0 instanceof FatalRenderingException) {
			 // Remove from existing Customer render groups.
			 leaveRenderGroups();
		 }
	 }

	 /**
	  * Remove this Renderable from existing uiCustomerBeans render groups.
	  * OnDemandRenderers are named/created using the underlying Customer Number.
	  */
	 private void leaveRenderGroups() {
		 if (Utilities.validationsList(vehiculoDTO)) {
			 for (VehiculoDTO vehiculoTmp : vehiculoDTO) {
				 renderManager.getOnDemandRenderer("VehiculoView").remove(this);
			 }
		 }
	 }

	 /**
	  * Add this Renderable to the new uiCustomerBeans render groups.
	  * OnDemandRenderers are named/created using the underlying Customer Number.
	  */
	 private void joinRenderGroups() {
		 if (Utilities.validationsList(vehiculoDTO)) {
			 for (VehiculoDTO vehiculoTmp : vehiculoDTO) {
				 renderManager.getOnDemandRenderer("VehiculoView").add(this);
			 }
		 }
	 }

	 public void dispose() throws Exception {
	 }

	 public RenderManager getRenderManager() {
		 return renderManager;
	 }

	 public void setState(PersistentFacesState state) {
		 this.state = state;
	 }

	 public HtmlInputText getTxtVehColor() {
		 return txtVehColor;
	 }

	 public void setTxtVehColor(HtmlInputText txtVehColor) {
		 this.txtVehColor = txtVehColor;
	 }

//	 public HtmlInputText getTxtEstCod_Estado() {
//		 return txtEstCod_Estado;
//	 }
//
//	 public void setTxtEstCod_Estado(HtmlInputText txtEstCod_Estado) {
//		 this.txtEstCod_Estado = txtEstCod_Estado;
//	 }

	 //    public HtmlInputText getTxtMarCod_Marca() {
	 //        return txtMarCod_Marca;
	 //    }
	 //
	 //    public void setTxtMarCod_Marca(HtmlInputText txtMarCod_Marca) {
	 //        this.txtMarCod_Marca = txtMarCod_Marca;
	 //    }

	 public HtmlInputText getTxtPerCedula_Persona() {
		 return txtPerCedula_Persona;
	 }

	 public void setTxtPerCedula_Persona(HtmlInputText txtPerCedula_Persona) {
		 this.txtPerCedula_Persona = txtPerCedula_Persona;
	 }

	 //    public HtmlInputText getTxtTpvCod_TipoVehiculo() {
	 //        return txtTpvCod_TipoVehiculo;
	 //    }
	 //
	 //    public void setTxtTpvCod_TipoVehiculo(HtmlInputText txtTpvCod_TipoVehiculo) {
	 //        this.txtTpvCod_TipoVehiculo = txtTpvCod_TipoVehiculo;
	 //    }

	 public SelectInputDate getTxtVehModelo() {
		 return txtVehModelo;
	 }

	 public void setTxtVehModelo(SelectInputDate txtVehModelo) {
		 this.txtVehModelo = txtVehModelo;
	 }

	 public HtmlInputText getTxtVehCod() {
		 return txtVehCod;
	 }

	 public void setTxtVehCod(HtmlInputText txtVehCod) {
		 this.txtVehCod = txtVehCod;
	 }

	 public HtmlCommandButton getBtnSave() {
		 return btnSave;
	 }

	 public void setBtnSave(HtmlCommandButton btnSave) {
		 this.btnSave = btnSave;
	 }

	 public HtmlCommandButton getBtnModify() {
		 return btnModify;
	 }

	 public void setBtnModify(HtmlCommandButton btnModify) {
		 this.btnModify = btnModify;
	 }

	 public HtmlCommandButton getBtnDelete() {
		 return btnDelete;
	 }

	 public void setBtnDelete(HtmlCommandButton btnDelete) {
		 this.btnDelete = btnDelete;
	 }

	 public HtmlCommandButton getBtnClear() {
		 return btnClear;
	 }

	 public void setBtnClear(HtmlCommandButton btnClear) {
		 this.btnClear = btnClear;
	 }

	 public void setRenderDataTable(boolean renderDataTable) {
		 this.renderDataTable = renderDataTable;
	 }

	 public void setFlag(boolean flag) {
		 this.flag = flag;
	 }

	 public List<VehiculoDTO> getVehiculoDTO() {
		 return vehiculoDTO;
	 }

	 public void setVehiculoDTO(List<VehiculoDTO> vehiculoDTO) {
		 this.vehiculoDTO = vehiculoDTO;
	 }

	 public TimeZone getTimeZone() {
		 return java.util.TimeZone.getDefault();
	 }

	 /**
	  * A special type of JSF DataModel to allow a datatable and datapaginator
	  * to page through a large set of data without having to hold the entire
	  * set of data in memory at once.
	  * Any time a managed bean wants to avoid holding an entire dataset,
	  * the managed bean declares this inner class which extends PagedListDataModel
	  * and implements the fetchData method. fetchData is called
	  * as needed when the table requires data that isn't available in the
	  * current data page held by this object.
	  * This requires the managed bean (and in general the business
	  * method that the managed bean uses) to provide the data wrapped in
	  * a DataPage object that provides info on the full size of the dataset.
	  */
	 private class LocalDataModel extends PagedListDataModel {
		 public LocalDataModel(int pageSize) {
			 super(pageSize);
		 }

		 public DataPage<Vehiculo> fetchPage(int startRow, int pageSize) {
			 // call enclosing managed bean method to fetch the data
			 return getDataPage(startRow, pageSize);
		 }
	 }

	 private class LocalDataModelDTO extends PagedListDataModel {
		 public LocalDataModelDTO(int pageSize) {
			 super(pageSize);
		 }

		 public DataPage<VehiculoDTO> fetchPage(int startRow, int pageSize) {
			 // call enclosing managed bean method to fetch the data
			 return getDataPageDTO(startRow, pageSize);
		 }
	 }
}
